package ar.edu.utn.frgp.banco.business.Implements;

import java.util.Date;

import ar.edu.utn.frgp.banco.business.Interfaces.IntPagosBusiness;
import ar.edu.utn.frgp.banco.dao.Implements.ImpClientes;
import ar.edu.utn.frgp.banco.dao.Implements.ImpCuenta;
import ar.edu.utn.frgp.banco.dao.Implements.ImpMovimientos;
import ar.edu.utn.frgp.banco.dao.Implements.ImpPagoPrestamo;
import ar.edu.utn.frgp.banco.dao.Implements.ImpPagoServivios;
import ar.edu.utn.frgp.banco.dao.Implements.ImpPrestamos;
import ar.edu.utn.frgp.banco.dao.Implements.ImpServicios;
import ar.edu.utn.frgp.banco.domain.Cliente;
import ar.edu.utn.frgp.banco.domain.Cuenta;
import ar.edu.utn.frgp.banco.domain.Movimiento;
import ar.edu.utn.frgp.banco.domain.PagoPrestamo;
import ar.edu.utn.frgp.banco.domain.PagoServicios;
import ar.edu.utn.frgp.banco.domain.Prestamos;
import ar.edu.utn.frgp.banco.domain.Servicio;

public class ImpPagosBusiness implements IntPagosBusiness {

	@Override
	public void RealizarPagoServicio(Integer id_cliente, Integer id_cuenta,
			Integer id_Servicio) throws Exception {
		
		try {
			// verifico si el cliente existe
			Cliente cliente = null;
			ImpClientes clientedao = new ImpClientes();
			cliente = clientedao.ObtenerCliente(id_cliente);
			if (cliente != null) { // Existe el cliente

				Cuenta cuentaSel = cliente.obtenerCuentaNro(id_cuenta);

				if (cuentaSel != null) {
					
					Servicio servicio = null;
					ImpServicios servDao = new ImpServicios();

					servicio = servDao.TraeServivio(id_Servicio);
					
					if (servicio != null) {
						
						double montoTotal = servicio.getMontoFijo();
						
						if (cuentaSel.getTipoCuenta().equals(Cuenta.TIPOCUENTA_CUENTACORRIENTE)) {
							montoTotal = servicio.getMontoFijo() * 1.0006;
						}
						
						if (cuentaSel.getSaldo() + cuentaSel.getDescubierto() >= montoTotal){
							
							//gemerar pago en tabla pagoservivios
							PagoServicios pago = new PagoServicios();
							pago.setFecha(new Date());
							pago.setId_cuenta(cuentaSel.getID_Cuenta());
							pago.setId_servicio(servicio.getId_servicio());
							
							ImpPagoServivios daoPagoServ = new ImpPagoServivios();
							daoPagoServ.AltaPagoServicios(pago);
							
							
							//generar movimiento en tabla de movimientos
							Movimiento movi = new Movimiento();
							movi.setId_cuenta(cuentaSel.getID_Cuenta());
							movi.setFecha(new Date());
							movi.setTipoMov(Movimiento.TIPOMOVIMIENTO_EXTRACCION);
							movi.setOrigen(Movimiento.ORIGEN_SERVICIO);
							movi.setSaldoActual(cuentaSel.getSaldo() - montoTotal);
							movi.setMonto(montoTotal);
							
							
							ImpMovimientos daoMov = new ImpMovimientos();
							daoMov.AltaMovimiento(movi);
							
							
							//actualizar el saldo de la cuenta 
							ImpCuenta daoCuenta = new ImpCuenta();
							daoCuenta.ActualizarSaldo(cuentaSel, cuentaSel.getSaldo() - montoTotal);
							
							
						}else{
							throw new Exception("Monto insuficiente. Ponga mas plata por favor!");
						}
					} else {
						throw new Exception("El servicio es inexistente. Seleccione otro servicio por favor.");
					}
				} else {
					throw new Exception("El cliente no posee la cuenta seleccionada. Seleccione otra cuenta.");
				}
			} else {
				throw new Exception("El cliente es inexistente.");
			}
		} catch (Exception e) {
			throw new Exception(e.getMessage());
		}

	}

	@Override
	public void RealizarPagoPrestamo(Integer id_cliente, Integer id_cuenta, Integer id_prestamo,
			Integer cuota, Double monto) throws Exception {
		
		try {
			
			// verifico si el cliente existe 
			Cliente cliente = null;
			ImpClientes clientedao = new ImpClientes();
			cliente = clientedao.ObtenerCliente(id_cliente);
			if (cliente == null) { // Existe el cliente
				throw new Exception("El cliente es inexistente.");
			}
			
			
			Cuenta cuentaAct = null;
			ImpCuenta daoCuenta = new ImpCuenta();
			
			//si ingreso CON CUENTA
			if (!id_cuenta.equals(0)){
				cuentaAct = daoCuenta.TraerCuenta(id_cuenta);
				if (cuentaAct == null){
					throw new Exception("La cuenta es inexistente. Ingrese otra cuenta por favor.");
				}
				
				if (cuentaAct.getSaldo() + cuentaAct.getDescubierto() < monto){
					throw new Exception("La cuenta no tiene fondos suficientes. Puede darme dinero?");					
				}
				
			}


			//verifico si el prestamo existe
			Prestamos presta = null;
			ImpPrestamos daoPrestamo = new ImpPrestamos();
			presta = daoPrestamo.TraePrestamo(id_prestamo);
			if (presta == null){
				throw new Exception("El prestamo es inexistente.");
			}
			
			//registro en pago cuota prestamo
			PagoPrestamo pagoPresta = new PagoPrestamo();
			pagoPresta.setId_cuenta(id_cuenta);
			pagoPresta.setId_prestamo(id_prestamo);
		    pagoPresta.setFecha(new Date());
		    pagoPresta.setMonto(monto);
		    
		    if (id_cuenta.equals(0)){
		    	pagoPresta.setOrigen(PagoPrestamo.ORIGENPAGOPRESTAMO_EFECTIVO);
		    }else{
		    	pagoPresta.setOrigen(PagoPrestamo.ORIGENPAGOPRESTAMO_CUENTA);
		    }
		    
		    pagoPresta.setNrocuota(cuota);
		   

			ImpPagoPrestamo daoPagoPres = new ImpPagoPrestamo();
			daoPagoPres.AltaPagoPrestamo(pagoPresta);
			
			
			if (!id_cuenta.equals(0)){
				
				//generar movimiento en tabla de movimientos
				Movimiento movi = new Movimiento();
				movi.setId_cuenta(id_cuenta);
				movi.setFecha(new Date());
				movi.setTipoMov(Movimiento.TIPOMOVIMIENTO_EXTRACCION);
				movi.setOrigen(Movimiento.ORIGEN_PRESTAMO);
				movi.setSaldoActual(cuentaAct.getSaldo() - monto);
				movi.setMonto(monto);
				
				ImpMovimientos daoMov = new ImpMovimientos();
				daoMov.AltaMovimiento(movi);
				
				//actualizacion de saldos
				daoCuenta.ActualizarSaldo(cuentaAct, cuentaAct.getSaldo() - monto);
				
			}	
		} catch (Exception e) {
			throw new Exception(e.getMessage());
		}

	}


}
